package com.pj.utils;

import com.pj.utils.cache.RedisUtil;
import com.pj.utils.sg.AjaxError;
import com.pj.utils.sg.IpCheckUtil;
import com.pj.utils.sg.NbUtil;


/**
 * 封装一下手机验证码的相关逻辑 ，包括：验证，防重发，防ip频繁等等
 * @author kong
 *
 */
public class VcUtil {

	// --------------------- 对接短信登录，只需更改以下两个方法的代码即可 start --------------------- 
	
	/**
	 * 对接第三方平台发送验证码，发送成功返回true，失败返回false 
	 * @param phone 手机号
	 * @param vc 验证码 
	 * @return 是否成功发送 
	 */
	private static boolean sendVc(String phone, String vc) {
		// ... 发送验证码 
		return true;
	}
	
	/**
	 * 随机生成一个验证码 
	 * @return 验证码 
	 */
	private static String randomVc() {
		return "123456"; 
//		return NbUtil.getcolde();
	}
	
	// --------------------- end --------------------- 
	

	/**
	 * 验证码存活时长，单位分钟
	 */
	final static int ckc_time = 30;

	// 用不同 type 隔离不同业务
	public final static String USER_LOGIN = "VC_USER_LOGIN:";		// 用户登录 
	public final static String USER_UPDATE_PWD = "VC_USER_UPDATE_PWD:";		// 用户更改密码 
	
	
	/**
	 * 发送一个验证码 （号码有效性、防重复发送、防ip频繁）
	 * @param type 业务type 
	 * @param phone 手机号 
	 */
	public static void send(String type, String phone) {
		// 先验证
		if(NbUtil.isPhone(phone) == false){
			throw new AjaxError("无效手机号码");
		}
		// 防重发
		if(RedisUtil.get(type + phone) != null){
			throw new AjaxError("该手机号验证码已发送，请注意查收");
		}
		// 校验ip是否频繁访问 
		IpCheckUtil.checkRes("user-login-send-vc", 30); 

		// 开始发送
		String number = randomVc();
		boolean bool = sendVc(phone, number);
		if(bool){
			// 存入redis 
			RedisUtil.setByMINUTES(type + phone, number, ckc_time);
			// 记录IP
			IpCheckUtil.setNow("user-login-send-vc");	
			return;
		}
		throw new AjaxError("验证码发送失败");
	}

	/**
	 * 校验一个手机号的验证码是否正确 
	 * @param type 业务类型 
	 * @param phone 手机号
	 * @param number 验证码 
	 */
	public static void check(String type, String phone, String number) {
		// 验证手机号
		if(NbUtil.isPhone(phone) == false) {
			throw new AjaxError("请输入一个正确的手机号码");
		}
		// 校验短信码
		String vc = RedisUtil.get(type + phone);
		if(vc == null){
			throw new AjaxError("验证码错误.");
		}
		if(vc.equals(number) == false) {
			throw new AjaxError("验证码错误");
		}
	}
	
	/**
	 * 删除指定手机号的验证码 
	 * @param type 业务类型 
	 * @param phone 手机号
	 */
	public static void delete(String type, String phone) {
		RedisUtil.del(type + phone);
	}

}
